/*
 * ArbolContextosPPMC.cpp
 *
 *  Created on: 29/04/2012
 *      Author: lucas
 */

#include "../hdr/ArbolContextosPPMC.h"
#include <stdio.h>
#include <string.h>

ArbolContextosPPMC::ArbolContextosPPMC() {
	memset(charsExcluidos, 0, 256 * sizeof(int));
}

int ArbolContextosPPMC::procesarCaracter(unsigned char caracter,
		unsigned char* contexto, size_t orden) {
	int exclusiones = nodoOrden0.getContexto()->getCantidadDeCaracteres();
	int exclusionesMenores =
			nodoOrden0.getContexto()->getCantidadDeCaracteresMenores(caracter);
	memset(charsExcluidos, 0, 256 * sizeof(int));
	if (_procesarCaracter(&nodoOrden0, caracter, contexto, orden, 0) == 1)
		return 1;
	printf(
			"Contexto de orden -1: Emite '%c' con probabilidad 1/%d (piso %d)\n\n",
			caracter, 257 - exclusiones, caracter - exclusionesMenores); // Debug
	return 0;
}

ArbolContextosPPMC::~ArbolContextosPPMC() {
	// TODO Auto-generated destructor stub
}

int ArbolContextosPPMC::_procesarCaracter(NodoContexto* nodo,
		unsigned char caracter, unsigned char* contexto, size_t orden,
		size_t profundidad) {
	NodoContexto* proximoNodo = NULL;
	if (profundidad < orden) {
		proximoNodo = nodo->getNodoContextoSuperior(
				contexto[orden - profundidad - 1]);
		if (_procesarCaracter(proximoNodo, caracter, contexto, orden,
				profundidad + 1) == 1)
			return 1;
	}
	ContextoPPMC* context = nodo->getContexto();
	// Debug
	unsigned char aux[256];
	strcpy((char*) aux, (char*) contexto);
	aux[orden] = 0;
	printf("Contexto '%s': ", aux + orden - profundidad);
	return context->emitirCaracter(caracter, charsExcluidos);
}

